﻿using System;

namespace Sinacor.Servico.Bovespa.Movimento.Service.ServiceImplementation.Translator.BusinessEntityToDataContract
{
    public static class ControleMovimentoOrdens
    {
        #region Métodos Públicos

        /// <summary>
        /// Traduz uma entidade de dados BusinessEntity.DataMovimento para um contrato de 
        /// dados DataContract.Response.DataMovimentoResponse
        /// </summary>
        /// <param name="from">BusinessEntity.DataMovimento</param>
        /// <returns>DataContract.Response.DataMovimentoResponse</returns>
        public static DataContract.Response.DataMovimentoResponse ToDataMovimentoResponse(BusinessEntity.DataMovimento from)
        {
            DataContract.Response.DataMovimentoResponse to = new DataContract.Response.DataMovimentoResponse();
            if(from.Valor.HasValue)
                to.Valor = from.Valor.Value;
            return to;
        }

        /// <summary>
        /// Traduz uma entidade de dados BusinessEntity.EstadoMovimento para um contrato de 
        /// dados DataContract.Response.EstadoMovimentoResponse
        /// </summary>
        /// <param name="from">BusinessEntity.EstadoMovimento</param>
        /// <returns>DataContract.Response.EstadoMovimentoResponse</returns>
        public static DataContract.Response.EstadoMovimentoResponse ToEstadoMovimentoResponse(BusinessEntity.EstadoMovimento from)
        {
            DataContract.Response.EstadoMovimentoResponse to = new DataContract.Response.EstadoMovimentoResponse();

            switch (from.Estado)
            {
                case BusinessEntity.Enum.TipoMovimento.Aberto:
                    to.Estado = DataContract.Enum.TipoMovimento.Abertura;
                    break;
                case BusinessEntity.Enum.TipoMovimento.Fechado:
                    to.Estado = DataContract.Enum.TipoMovimento.Fechamento;
                    break;
                case BusinessEntity.Enum.TipoMovimento.ProcessoFechamento:
                    to.Estado = DataContract.Enum.TipoMovimento.ProcessoFechamento;
                    break;
                case BusinessEntity.Enum.TipoMovimento.Reaberto:
                    to.Estado = DataContract.Enum.TipoMovimento.Reabertura;
                    break;
            }            

            return to;
        }

        /// <summary>
        /// Traduz uma entidade de dados BusinessEntity.InformacoesMovimento para um contrato de 
        /// dados DataContract.Response.InformacoesMovimentoResponse
        /// </summary>
        /// <param name="from">BusinessEntity.InformacoesMovimento</param>
        /// <returns>DataContract.Response.InformacoesMovimentoResponse</returns>
        public static DataContract.Response.InformacoesMovimentoResponse ToInformacoesMovimentoResponse(BusinessEntity.InformacoesMovimento from)
        {
            DataContract.Response.InformacoesMovimentoResponse to = new DataContract.Response.InformacoesMovimentoResponse();
            to.DataMovimento = from.DataMovimento;
            to.DataVersao = from.DataVersao;

            switch (from.EstadoMovimento)
            {
                case BusinessEntity.Enum.TipoMovimento.Aberto:
                    to.EstadoMovimento = DataContract.Enum.TipoMovimento.Abertura;
                    break;
                case BusinessEntity.Enum.TipoMovimento.Fechado:
                    to.EstadoMovimento = DataContract.Enum.TipoMovimento.Fechamento;
                    break;
                case BusinessEntity.Enum.TipoMovimento.ProcessoFechamento:
                    to.EstadoMovimento = DataContract.Enum.TipoMovimento.ProcessoFechamento;
                    break;
                case BusinessEntity.Enum.TipoMovimento.Reaberto:
                    to.EstadoMovimento = DataContract.Enum.TipoMovimento.Reabertura;
                    break;
                case BusinessEntity.Enum.TipoMovimento.AtualizandoVersao:
                    to.EstadoMovimento = DataContract.Enum.TipoMovimento.AtualizandoVersao;
                    break;
            }
            
            return to;
        }

        /// <summary>
        /// Traduz uma entidade de dados BusinessEntity.Resultado para um contrato de 
        /// dados DataContract.Response.ResultadoResponse
        /// </summary>
        /// <param name="from">BusinessEntity.Resultado</param>
        /// <returns>DataContract.Response.ResultadoResponse</returns>
        public static DataContract.Response.ResultadoResponse ToResultadoResponse(BusinessEntity.Resultado from)
        {
            DataContract.Response.ResultadoResponse to = new DataContract.Response.ResultadoResponse();
            to.Sucesso = from.Sucesso;
            return to;
        }

        /// <summary>
        /// Traduz uma entidade de dados BusinessEntity.Resultado para um contrato de 
        /// dados DataContract.Response.ResultadoSimulacaoResponse
        /// </summary>
        /// <param name="from">BusinessEntity.Resultado</param>
        /// <returns>DataContract.Response.ResultadoSimulacaoResponse</returns>
        public static DataContract.Response.ResultadoSimulacaoResponse ToResultadoSimulacaoResponse(BusinessEntity.Resultado from)
        {
            DataContract.Response.ResultadoSimulacaoResponse to = new DataContract.Response.ResultadoSimulacaoResponse();
            to.ImpedeFechamento = from.ImpedeFechamento;
            to.Sucesso = from.Sucesso;
            return to;
        }

        #endregion
    }
}
